#!/usr/bin/env python3
"""
InCloud MCP Server 启动器
支持 sse, stdio, streamable-http 传输方式
"""
import sys
import os
import argparse
import logging

# 添加 src 目录到 Python 路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))

def setup_logging():
    """设置日志"""
    # Import here to avoid circular imports
    from incloud_mcp_server.logging_config import setup_logging as enhanced_setup_logging, configure_third_party_loggers

    # Setup enhanced logging
    log_file_path = enhanced_setup_logging(
        log_level="INFO",
        log_file=None,  # Auto-generate
        log_dir="logs",
        console_output=True
    )

    # Configure third-party loggers
    configure_third_party_loggers()

    return log_file_path

def start_server(transport="sse", port=8000, host="0.0.0.0", config_file="config.yaml"):
    """启动 InCloud MCP Server"""
    
    print("🚀 InCloud MCP Server")
    print("=" * 60)
    print(f"📡 传输方式: {transport}")
    print(f"🌐 主机地址: {host}")
    print(f"🔌 端口号: {port}")
    print(f"📋 配置文件: {config_file}")
    print("=" * 60)
    
    # 检查配置文件
    if not os.path.exists(config_file):
        print(f"❌ 配置文件 {config_file} 不存在")
        print("请先创建配置文件")
        return False
    
    try:
        # 设置日志
        log_file_path = setup_logging()

        # 导入必要模块
        from incloud_mcp_server.config import load_config
        from incloud_mcp_server.swagger.tool_generator import ToolGenerator
        from incloud_mcp_server.tools.common_tools import tools as common_tools, set_custom_service_list
        from fastmcp import FastMCP

        print("📦 正在加载配置...")
        print(f"📁 日志文件: {log_file_path}")

        # 加载配置
        app_config = load_config(config_file)
        print(f"✅ 配置加载成功")
        print(f"   Swagger URL: {app_config.swagger.base_url}")

        # 获取启用的服务
        enabled_services = app_config.get_enabled_services()
        print(f"   启用的服务: {list(enabled_services.keys())}")
        
        print("\n🔧 正在创建 MCP 服务器...")
        
        # 创建 MCP 服务器
        mcp = FastMCP(
            name="incloud-mcp-server",
            port=port,
            host=host,
            stateless_http=True
        )
        
        print("🛠️  正在注册通用工具...")
        
        # 注册通用工具
        for tool in common_tools:
            mcp.tool(tool)
        
        # 设置自定义服务列表
        service_list = [(name, f"InCloud {name.title()} Service") for name in enabled_services.keys()]
        set_custom_service_list(service_list)
        
        print("🔄 正在生成动态工具...")
        
        # 生成动态工具
        tool_generator = ToolGenerator(app_config)
        total_tools = 0
        
        for service_name in enabled_services.keys():
            try:
                print(f"   正在为 {service_name} 生成工具...")
                service_tools = tool_generator.generate_service_tools(service_name)
                
                for tool_func in service_tools:
                    mcp.tool(tool_func)
                    total_tools += 1
                
                print(f"   ✅ {service_name}: {len(service_tools)} 个工具")
                
            except Exception as e:
                print(f"   ⚠️  {service_name}: 生成工具失败 - {e}")
                continue
        
        print(f"\n📊 工具注册完成:")
        print(f"   通用工具: {len(common_tools)} 个")
        print(f"   动态工具: {total_tools} 个")
        print(f"   总计: {len(common_tools) + total_tools} 个工具")
        
        print("\n🚀 正在启动服务器...")
        
        if transport in ["sse", "streamable-http"]:
            print(f"🌐 服务器地址: http://{host}:{port}")
            if transport == "sse":
                print("📡 传输协议: Server-Sent Events (SSE)")
            else:
                print("📡 传输协议: Streamable HTTP")
        else:
            print("📡 传输协议: Standard I/O (STDIO)")
        
        print("=" * 60)
        print("✅ 服务器启动成功！")
        print("按 Ctrl+C 停止服务器")
        print("=" * 60)
        
        # 启动服务器
        mcp.run(transport=transport)
        
        return True
        
    except KeyboardInterrupt:
        print("\n\n⏹️  服务器已停止")
        return True
    except Exception as e:
        print(f"\n❌ 启动失败: {e}")
        import traceback
        traceback.print_exc()
        return False

def main():
    """主函数"""
    parser = argparse.ArgumentParser(
        description="InCloud MCP Server - Swagger 自动工具注册",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
传输方式说明:
  sse              Server-Sent Events (默认，推荐用于 Web 客户端)
  stdio            Standard I/O (用于命令行客户端)
  streamable-http  Streamable HTTP (用于 HTTP 客户端)

示例:
  python launch.py                                    # 使用默认设置 (SSE, 端口 8000)
  python launch.py --transport stdio                  # 使用 STDIO 传输
  python launch.py --transport sse --port 9000        # 使用 SSE，端口 9000
  python launch.py --transport streamable-http        # 使用 Streamable HTTP
        """
    )
    
    parser.add_argument(
        "--transport", 
        choices=["sse", "stdio", "streamable-http"],
        default="sse",
        help="传输方式 (默认: sse)"
    )
    parser.add_argument(
        "--port", 
        type=int, 
        default=8000,
        help="端口号 (默认: 8000)"
    )
    parser.add_argument(
        "--host", 
        default="0.0.0.0",
        help="主机地址 (默认: 0.0.0.0)"
    )
    parser.add_argument(
        "--config", 
        default="config.yaml",
        help="配置文件路径 (默认: config.yaml)"
    )
    
    args = parser.parse_args()
    
    success = start_server(
        transport=args.transport,
        port=args.port,
        host=args.host,
        config_file=args.config
    )
    
    sys.exit(0 if success else 1)

if __name__ == "__main__":
    main()
